/*   
    Copyright (C) 2009 Galaktika Corporation ZAO

    This file is a part of Galaktika.BusinessMonitor
 
    Galaktika.BusinessMonitor is a free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
      
    You should have received a copy of the GNU General Public License
    along with Galaktika.BusinessMonitor.  If not, see <http://www.gnu.org/licenses/>.
  
    If GPL v.3 is not suitable for your products or company,
    Galaktika Corp provides Galaktika.BusinessMonitor under a flexible commercial license
    designed to meet your specific usage and distribution requirements.
    If you have already obtained a commercial license from Galaktika Corp,
    you can use this file under those license terms.
*/

using System;
using System.Collections.Generic;
using System.Text;

namespace Galaktika.BI.Silverlight.ClientApp.Web.Runtime.DataAccess
{
    using Galaktika.BI.Extensibility.Dom;
    using Galaktika.BI.Extensibility.Dom.Dac;
    using Galaktika.BI.Runtime.Services;

    public class OleDbDataManager : IDataManager
    {
        private string m_ConnStr;
        private string m_Query;
        public OleDbDataManager(string name, string connStr, string query)
        {
            m_Name = name;
            m_ConnStr = connStr;
            m_Query = query;
        }

        #region IDataManager Members

        private string m_Name;
        public string Name
        {
            get
            {
                return m_Name;
            }
        }

        public object this[IBindingContext context]
        {
            get 
            {
                return this.CreateBindObject(context);
            }
        }

        public object this[string name]
        {
            get
            {
                switch (name)
                {
                    case "CONNECTION_STRING":
                        return m_ConnStr;
                    case "QUERY":
                        return m_Query;
                    default:
                        return string.Empty;
                }
            }
            set
            {
                switch (name)
                {
                    case "CONNECTION_STRING":
                        m_ConnStr = (string)value;
                        break;
                    case "QUERY":
                        m_Query = (string)value;
                        break;
                }
            }
        }

        #endregion

        public bool Cancel()
        {
            return true;
        }

        private object CreateBindObject(IBindingContext context)
        {
            object res = null;
            IExecutionContext exe = (IExecutionContext)context.Services.GetService(typeof(IExecutionContext));
            if (exe != null)
            {
                var parsedConnStr = exe.Parse(context, m_ConnStr);
                var parsedQuery = exe.Parse(context, m_Query);

                res = DbQueryExecutor.ExecuteQuery(
                    parsedConnStr,
                    parsedQuery,
                    Galaktika.BI.Silverlight.Services.ConnectionType.OleDb,
                    m_Name,
                    context);
            }

            return res;
        }
    }
}
